package qc.module.duty.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.duty.dto.schedule.DutyScheduleShiftMemberDto;
import qc.module.duty.dto.staff.DutyStaffDto;
import qc.module.duty.entity.DutyScheduleMember;
import qc.module.duty.mapper.DutyScheduleMemberMapper;
import qc.module.duty.repository.DutyScheduleMemberRepository;

import java.util.List;

/**
 * @projectName: qcdp
 * @package: qc.module.duty.service
 * @className: DutyScheduleMemberService
 * @version: 1.0
 */

@Service
public class DutyScheduleMemberService {

    private DutyScheduleMemberRepository repository;

    @Autowired
    public void setRepository(DutyScheduleMemberRepository repository) {
        this.repository = repository;
    }

    private DutyStaffService dutyStaffService;

    @Autowired
    public void setDutyStaffService(DutyStaffService dutyStaffService) {
        this.dutyStaffService = dutyStaffService;
    }

    /**
     * 根据排班班次id查询值班排班人员信息，按照duty_schedule_member表中的odr升序排序
     *
     * @param id: 值班排班人员表id
     * @return DutyScheduleShiftMemberDto 返回信息
     * @author QcCheng Tech
     * @date 2023/8/10
     */
    public List<DutyScheduleShiftMemberDto> get(int id) {
        // 创建 LambdaQueryWrapper 对象，用于构建查询条件
        LambdaQueryWrapper<DutyScheduleMember> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DutyScheduleMember::getId, id);
        //按odr升序排序
        wrapper.orderByAsc(DutyScheduleMember::getOdr);

        // 执行查询，获取值班安排班次成员列表
        List<DutyScheduleMember> dutyScheduleMembers = repository.selectList(wrapper);
        // 如果查询结果不为空
        if (dutyScheduleMembers.size() > 0) {
            // 将值班安排班次成员列表转换为 DTO 列表
            return DutyScheduleMemberMapper.MAPPER.toTeamMemberDtoList(dutyScheduleMembers);
        }
        return null;
    }

    /**
     * 获取指定班次的值班成员
     *
     * @param id: 值班排班id
     * @return DutyTeamMemberDto 返回信息
     * @author QcCheng Tech
     * @date 2023/8/10
     */
    public List<DutyScheduleShiftMemberDto> getTeamMembers(int id) {
        // 通过值班调度成员服务获取团队成员信息
        List<DutyScheduleShiftMemberDto> dutyScheduleShiftMemberDtos = get(id);
        if (dutyScheduleShiftMemberDtos != null && !dutyScheduleShiftMemberDtos.isEmpty()) {
            for (DutyScheduleShiftMemberDto dutyScheduleShiftMemberDto : dutyScheduleShiftMemberDtos) {
                // 根据团队成员ID调用值班人员服务获取值班人员详细信息
                DutyStaffDto dutyStaffDto = dutyStaffService.get(dutyScheduleShiftMemberDto.getMemberid());

                // 添加值班人员详细信息到团队成员DTO对象
                dutyScheduleShiftMemberDto.setMember(dutyStaffDto);
            }
            // 返回团队成员DTO对象
            return dutyScheduleShiftMemberDtos;
        }
        return null;
    }

    /**
     * 删除指定班次的值班人员，按班次ID删除所有人员
     *
     * @param scheduleId: 班次id
     * @author QcCheng Tech
     * @date 2023/8/14
     */
    public void deleteScheduleMembers(int scheduleId) {
        LambdaQueryWrapper<DutyScheduleMember> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DutyScheduleMember::getId, scheduleId);
        repository.delete(wrapper);
    }

    /**
     * 删除指定班次的指定
     *
     * @param scheduleId 班次ID
     * @param memeberId  人员ID
     * @author QcCheng Tech
     * @date 2023/8/12
     */
    public void deleteShiftMember(int scheduleId, int memeberId) {
        LambdaQueryWrapper<DutyScheduleMember> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DutyScheduleMember::getId, scheduleId);
        wrapper.eq(DutyScheduleMember::getMember, memeberId);

        repository.delete(wrapper);
    }

    /**
     * 批量插入班次人员
     *
     * @param staffids:班次人员id
     * @return void
     * @author QcCheng Tech
     * @date 2023/8/12
     */
    public String addScheduleMembers(List<Integer> staffids, int id) {
        for (int staffId : staffids) {
            DutyScheduleMember dutyScheduleMember = new DutyScheduleMember();
            dutyScheduleMember.setId(id);
            dutyScheduleMember.setMember(staffId);
            dutyScheduleMember.setOdr(100);
            dutyScheduleMember.setChief(false);
            if (repository.insert(dutyScheduleMember) < 1) {
                return QCUnifyReturnValue.Warn("插入失败");
            }
        }

        return QCUnifyReturnValue.Success();
    }

    /***
     * 获取所有的值班排班人员信息
     *
     * @return java.util.List<qc.module.duty.entity.DutyScheduleMember>
     * @author QuCheng Tech
     * @since 2023/8/12
     */
    public List<DutyScheduleMember> getAllScheduleMembers() {
        LambdaQueryWrapper<DutyScheduleMember> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByAsc(DutyScheduleMember::getId);
        wrapper.orderByAsc(DutyScheduleMember::getMember);
        return repository.selectList(wrapper);
    }

    /**
     * 修改指定班次人员，用于设置成员的排序号和是否为值班长
     *
     * @return 成功返回null
     * @author QcCheng Tech
     * @date 2023/8/12
     */
    public String setShiftMember(DutyScheduleShiftMemberDto dto) {
        if (dto == null) {
            return QCUnifyReturnValue.Warn("修改信息不能为空");
        }
        if (dto.getId() < 1) {
            return QCUnifyReturnValue.Warn("排班ID不能为空");
        }
        if (dto.getMemberid() < 1) {
            return QCUnifyReturnValue.Warn("人员ID不能为空");
        }
        // 判断排序号是否在范围内
        if (dto.getOdr() > 100 || dto.getOdr() < 0) {
            dto.setOdr(100);
        }
        // 构建更新条件
        LambdaUpdateWrapper<DutyScheduleMember> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(DutyScheduleMember::getId, dto.getId());
        wrapper.eq(DutyScheduleMember::getMember, dto.getMemberid());

        // 设置更新字段
        wrapper.set(DutyScheduleMember::getOdr, dto.getOdr());
        wrapper.set(DutyScheduleMember::getChief, dto.isChief());

        // 执行更新操作
        boolean updated = repository.update(null, wrapper) > 0;
        if (!updated) {
            return QCUnifyReturnValue.Warn("修改失败");
        }
        return QCUnifyReturnValue.Success();
    }
}
